home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 5 / The 640 Meg Shareware Studio CD-ROM Volume V (Data Express)(1994).ISO / amiga / rfs156.lha / rexx / Wfilelist.rexx < prev    next >
OS/2 REXX Batch file  |  1993-11-05  |  18KB  |  533 lines

  1. /**/
  2. v="$VER: WFileList  Rexx FileList and WPL Freq List Creator Williamson 50.02"
  3. /*
  4.    Written for Russell McOrmond
  5.    Based on Falcon File Manager by Robert Williamson 1:167/104.0
  6.         Originally Modified for Falcon CBCS By Tony Jones (2:255/35)
  7.         from Tim Aston's TransAmiga BBS script, FileUtil.trans
  8.  
  9.    The calling convention is: rx Wfilelist ALL|AREA|FREQ
  10.  
  11.             all    Creates and archives an all files listing
  12.                    and a Wnotify/XfreqSh/RFS FREQ listing. 
  13.  
  14.             freq   Creates a Wnotify/XfreqSh/RFS FREQ listing. 
  15.  
  16.       Be sure to change the List command exclusion parameters (EXCLUDE)  
  17.       for those files you want ignored in listings
  18.  
  19.     Config File Format: (bbslist)
  20.     AREA 1
  21.     NAME "Communications SOFTWARE"
  22.     PATH "BBSFILES:comms/"
  23.     PASSWORD areapassword               <---optional password for area
  24.     
  25.     area.text (areatext) format:
  26.     Simple text file in EACH area, describing the scope of the area. 
  27.     Each  line should begin with AT LEAST ONE SPACE and a blank line should
  28.     terminate.
  29.  
  30.     file header (htext) format:
  31.     Simple text file describing the system, You may include info on magic 
  32.     filenames, freq times etc...Each line should begin 
  33.     with AT LEAST ONE SPACE and a blank line should terminate.
  34.  
  35.     You NEED Andy Finkles' WB2 PIPE command.
  36. */
  37.  
  38. /* Your system name and address here */
  39. system   = "Hysterics"
  40. listnote = "Available files 1:163/109.0@fidonet, updated nightly"
  41.  
  42. default  = "  Sorry, there is no description for this area"||cr||cr
  43. /*          ^^ spaces required! */
  44.  
  45. /* LIST exclusion parameters    */
  46. EXCLUDE     =   '~(area.text|files.bbs|LZTEMP.#?|.info)'
  47.  
  48. /* WB2 List Lformat parameters  */
  49. LFFREQ      =   '"%N %F%N"'                       /* freq.lst         */
  50. LF_TWENTY   =   '"%-20N%7L %-9D %C"'              /* all files list   */
  51. LF_THIRTY   =   '"%-30N %C"'                      /* areas.bbs        */
  52.  
  53. /* line wrap parameters */
  54. FLLEN           =   77  /* list line length  */
  55. MARGINALL       =   39  /* margin for LF_TWENTY  - wraptofile prepends a space  */
  56.  
  57. /*  You must create these files */
  58. bbslist     = "RAM:fileareas.bbs"               /* filearea config  */
  59. htext       = "CFG:filelistheader.txt"          /* System header */
  60. mtext       = "CFG:MAGIC.TXT"                   /* FREQ Magic names */
  61. areatext    = 'area.text'                       /* area description */
  62.  
  63. /* output files - edit names to suit */
  64. freqlist     = "MAIL:freq.lst"                  /* filename, full path */
  65. allfileslist = "MAIL:ATRONIX.LST"               /* Normal Level List */
  66. allfilesarc  = "MAIL:ATRONIX.LHA"               /* Archived Normal List */
  67.  
  68. /* Rename this to something else if the     */
  69. /* format used is not compatible with your  */
  70. /* bbs software  (eg: TransAMiga, DLG )     */               
  71. flist        = 'files.bbs'                      /* area desc and files */
  72.  
  73.  
  74. /* Configuration of Magic File Names for FREQ List              */
  75. /* Standard MAGIC FileNames That Never Change                   */
  76. /* DO NOT change these entries, these are configured above      */
  77. magic.1 = "FILES    > "allfilesarc                   /* configured above */
  78. magic.2 = "NEWFILES >  Mail:newfiles"                /*  do it yourself  */
  79. magic.3 = "NEW      >  Mail:newfiles"                /*  do it yourself  */
  80. magic.4 = "MAGIC    > "mtext                         /* configured above */
  81. magic.5 = "ABOUT    > "htext                         /* configured above */
  82.  
  83. /* add your FIXED MAGIC names here */
  84. magic.6     = "ROOFREXX > bbsf6:ROOF/ROOF_REXX.LHA"
  85. magic.7     = "ROOFDOS  > bbsf6:ROOF/ROOF_DOS.LHA"
  86. magic.8     = "ROOFDOCS > bbsf6:ROOF/ROOF_DOCS.LHA"
  87. magic.9     = "ROOFBIN  > bbsf6:ROOF/ROOF_BIN.LHA"
  88. magic.10    = "ROOFRCP  > bbsf6:ROOF/ROOF_RCP.LHA"
  89. magic.11    = "ROOFWPL  > BBSF6:ROOF/ROOF_WPL.LHA"
  90. magic.12    = "ROOF     > BBSF6:ROOF/ROOF.LHA"
  91.  
  92. /* FileNames that require updating to the latest version should */
  93. /* use '^' instead of '>'                                       */
  94. magic.13    = "FILEMGR      ^ BBSF6:ROOF/FILEMGR_V??.??.LHA"
  95. magic.14    = "FANSI        ^ BBSF2:G&S/FANSI_V?.?.LHA"
  96. magic.15    = "DEKSID       ^ BBSF6:DUTIL/DEK???.LHA"
  97. magic.16    = "BBSLIST      ^ BBSF5:MTL-BBS/BBS?????.LST"
  98.  
  99. /* Where more than one file will be sent for a MAGIC name       */
  100. /* just have multiple entries pointing to same magic name       */
  101. magic.17 = "WELMAT          > BBSF6:WPL_INTRO.LZH"
  102.  
  103. /* Password Protected Files */
  104. magic.18 = "PFILES !geewiz     BBS:text/Private.list"
  105. magic.19 = "AFILES !bobo       BBS:text/Assist.list"
  106.  
  107. magic.20 = "MAILSCAN        > BBSF6:FALCON/MailScan_v1.39.LHA"
  108. magic.21 = "ROOFBBS         > bbsf6:ROOF/Roof_BBS.LHA"
  109. magic.22 = "ROOFRCP         > BBSF6:ROOF/ROOF_RCP.LHA"
  110. magic.23 = "ROOFTA          > BBSF6:ROOF/ROOF_TA.LHA"
  111. magic.24 = "ROOFDLG         > BBSF6:ROOF/ROOF_DLG.LHA"
  112.  
  113. magic.25 = "AREAMGR         ^ BBSF6:ROOF/AM_v????.LHA"
  114. magic.26 = "CFG             > CFG:ROOF.WPL"
  115. magic.27 = "CFG             > CFG:ROOF.CFG"
  116. magic.28 = "BTC             > S:BTC"
  117. magic.29 = "WPL !hoho         BBSF6:WPL/WPL_INTRO.LZH"
  118. magic.30 = "RFS             > BBSF6:WPL/RFS.LHA"
  119. magics = 30
  120. magic.0 = 30
  121. /* NUMBER of MAGIC NAMES */
  122.  
  123. /* used internally */
  124. fileslist    = "T:ALST-"Pragma('ID')            /* temporary all file */
  125. freqtmp      = "T:FLST-"Pragma('ID')            /* temporary freq list */
  126. msgtmp       = "T:MLST-"Pragma('ID')            /* temporary area list */
  127.  
  128.  
  129. script  = "WFileList"
  130. ver     = "v"||right(sv),5)
  131. cr      = '0a'x
  132. CSI     = '9b'x
  133. OFF     = CSI||'0m'
  134. BOLD    = CSI||'1m'
  135. ULINE   = CSI||'4m'
  136. ITALICS = CSI||'3;40m'
  137. quote   = '"'
  138.  
  139. fmvers  = BOLD||''script ver||OFF
  140.  
  141. options results
  142. options failat 20
  143.  
  144. signal on halt
  145. signal on ioerr
  146. signal on break_c
  147. signal on break_d
  148.  
  149. if ~show("L", "rexxsupport.library") then
  150.     if ~addlib("rexxsupport.library", 0, -30, 0) then
  151.         do
  152.                 say "Couldn't access support.library !"
  153.                 exit 20
  154.         end
  155.  
  156.     call close 'STDIN';call open 'STDIN','*','R'
  157.  
  158.     if ~open('dlst',bbslist, 'R') then
  159.     do
  160.         say "Couldn't open fileareas list !"
  161.         exit 20
  162.     end
  163.  
  164. parse upper arg fcmd
  165.     if fcmd = "" then call usage
  166.     say cr||ITALICS||" "fmvers||cr||" by Robert Williamson 1:167/104.0@fidonet"||OFF||cr
  167.     lopt=upper(strip(fcmd))              /* LIST type */
  168.  
  169.     /* Start Area Processing */
  170.     say 'Reading fileareas'
  171.     area = 0
  172.     do while ~eof('dlst')
  173.         blstln=readln('dlst')
  174.         if blstln="" then iterate
  175.         blstkey=upper(left(blstln, 4))
  176.         select
  177.             when blstkey = 'AREA' then
  178.             do
  179.                 area=area+1
  180.                 Number.area=strip(word(blstln,2) )
  181.             end
  182.             when blstkey= 'NAME' then Name.area=strip( substr(blstln,6,79) )
  183.             when blstkey= 'PATH' then Path.area=strip( substr(blstln,6,40) )
  184.             when blstkey= 'PASS' then Password.area=strip(word(blstln,2) )
  185.             otherwise  nop
  186.             /*say 'Keyword 'blstkey 'not processed'     */
  187.         end  /* select */
  188.     end /*eof*/
  189.     areas=area
  190.     say 'Found 'areas' file areas'
  191.  
  192.     if lopt = 'ALL' then
  193.     do
  194.         /* open all file listing, put title, date */
  195.         /* and system header in files list */
  196.         say ULINE||"Generating All Files Listing for "system ||OFF ; say
  197.         datum = delstr(space(date(), 1, "-"), 8, 2) time()
  198.         tmpnorm=fileslist'NORMAL'
  199.  
  200.         say 'Adding header to 'tmpnorm
  201.         open('tbl', tmpnorm, 'W')
  202.         call writech 'tbl', " "fmvers" by Robert Williamson 1:167/104.0@fidonet" ||cr
  203.         call writech 'tbl', " FileListing for" system  datum ||cr ||cr
  204.         close('tbl')
  205.  
  206.         if ~exists('htext') then
  207.         do
  208.             say 'Adding headerfile' htext 'to 'tmpnorm
  209.             com= 'Type >> "'tmpnorm'" "'htext'"'
  210.             address COMMAND com
  211.         end
  212.  
  213.         call open_freq
  214.  
  215.         call process_cmd(areas)
  216.  
  217.         if exists(freqtmp) then call close_freq
  218.  
  219.         tmpnorm=fileslist'NORMAL'
  220.     
  221.         address COMMAND 'Copy' tmpnorm allfileslist
  222.         address COMMAND 'FileNote "'allfileslist'" "'listnote'"'
  223.  
  224.         say 'Archiving 'allfileslist' as 'allfilesarc
  225.         address COMMAND 'lha -2 f "'allfilesarc'" "'allfileslist'"'
  226.         address COMMAND 'FileNote "'allfilesarc'" "'listnote'"'
  227.         say lopt||' File Listing completed'
  228.  
  229.     end
  230.     if lopt = "FREQ" then 
  231.     do
  232.         call open_freq
  233.         call process_cmd(areas)
  234.         if exists(freqtmp) then call close_freq   
  235.     end
  236.     else call usage
  237. cleanup:
  238.     call delete(fileslist)
  239.     call delete(freqtmp)      
  240.     call delete(msgtmp)
  241. exit 
  242.    
  243. open_freq:
  244.     say ULINE||"Generating File Request Listing for "system ||OFF ; say
  245.     if ~exists(mtext) then
  246.     do
  247.         call open('lstf',freqtmp,'W')      /* create the file */
  248.         call close('lstf')                 /* delete old one  */
  249.     end
  250.     else do
  251.         address COMMAND 'Copy' mtext freqtmp
  252.     end
  253.     if (magics ~= 0) then call do_magic
  254. return
  255.  
  256. do_magic:
  257.     CR='0a'x
  258.     if ~open('tfl',freqtmp,'A') then
  259.     do
  260.         Say 'Unable to open 'freqtmp
  261.         call cleanup
  262.         exit 10
  263.     end
  264.     say 'Updating 'magics' Magic names'
  265.     do i=1 to magics
  266.         /*                                                  file/magicname           !password                fullpath */
  267.         if left(word(magic.i,2),1) = '!' then writech('tfl',strip(word(magic.i,1))' 'strip(word(magic.i,2))' 'strip(word(magic.i,3))||CR)
  268.             else if word(magic.i,2) = '>' then writech('tfl',strip(word(magic.i,1))' 'strip(word(magic.i,3))||CR)
  269.         if word(magic.i,2) = '^' then
  270.         do
  271.             close('tfl')
  272.             cmd='List >>'freqtmp word(magic.i,3) LFORMAT '"'word(magic.i,1)' %P%N"'
  273.             address COMMAND cmd
  274.             open('tfl',freqtmp,'A')
  275.         end
  276.     end
  277.     call close('tfl')
  278. return
  279.  
  280. close_freq:
  281.     address COMMAND 'SORT' freqtmp freqlist   
  282.     if exists("RAM:FREQ.LST") then address COMMAND 'Copy' freqlist "RAM:FREQ.LST"         
  283.     say lopt||' Freq Listing completed'
  284. return
  285.  
  286. process_cmd:
  287.     areas=arg(1)
  288.     say areas' areas found'
  289.     do area=1 to areas
  290.         if area ~= 0 then
  291.         do
  292.             /* Display info on a area */
  293.             say BOLD||'Area       '||OFF Number.area
  294.             say BOLD||'Name       '||OFF Name.area
  295.             say BOLD||'Path       '||OFF Path.area
  296.             say BOLD||'Password   '||OFF Password.area
  297.             say
  298.             if lopt='FREQ' then
  299.             do
  300.                 if Password.area = "PASSWORD."area | Password.area = "" then 
  301.                 do
  302.                     address COMMAND 'List >>"'freqtmp'"' Path.area||exclude 'FILES NOHEAD LFORMAT='LFFREQ
  303.                 end
  304.                 else do
  305.                     SAY 'Area:'area 'Password:'Password.area
  306.                     address COMMAND 'List >>"'freqtmp'"' Path.area||exclude 'FILES NOHEAD LFORMAT="%N !'Password.area' %F%N"'
  307.                 end
  308.             end
  309.             else if lopt = 'ALL' then
  310.             do
  311.                 if Password.area ~= "PASSWORD."||area then iterate
  312.                 dir=addslash(dequote(Path.area))
  313.                 /* Update an areas files.bbs from the filenotes */
  314.                 listandsort(dir,dir||flist,LF_THIRTY)
  315.                 addareatext(dir,dir||flist,areatext,dir||flist,'prepend')
  316.  
  317.                 say 'Appending 'dir Number.area Name.area' to 'fileslist
  318.                 btarea=center("AREA: "Number.Area,21)
  319.                 btitle=center(Name.Area,41)
  320.                 call appendtolist(fileslist,CR||CR)
  321.                 call appendtolist(fileslist,'╒══════════════════════════╤═════════════════════╤══════════════════════════╕'||CR)
  322.                 call appendtolist(fileslist,'│ ░░░░░▒▒▒▒▒▓▓▓▓▓█████▓▓▓▓▓│'btarea'│▓▓▓▓▓█████▓▓▓▓▓▒▒▒▒▒░░░░░ │'||CR)
  323.                 call appendtolist(fileslist,'├────────────────┬─────────┴─────────────────────┴─────────┬────────────────┤'||CR)
  324.                 call appendtolist(fileslist,'│ ░░░░░▒▒▒▒▒▓▓▓▓▓│'btitle'│▓▓▓▓▓▒▒▒▒▒░░░░░ │'||CR)
  325.                 call appendtolist(fileslist,'╘════════════════╧═════════════════════════════════════════╧════════════════╛'||CR)
  326.                 call listandsort(dir,msgtmp,LF_TWENTY)
  327.                 call addareatext(dir,msgtmp,areatext,msgtmp.'prepend')
  328.  
  329.                 /*
  330.                  Appends and wordwraps an files.bbs or newfiles.tmp to an
  331.                  allfiles list or message
  332.                  a leading space is pre-pended, comment lines are not wrapped
  333.                 */
  334.                 if ~open('ifn',msgtmp,'R') then
  335.                 do
  336.                     say 'wraptofile:Cannot open 'msgtmp
  337.                     exit 10
  338.                 end
  339.             
  340.                 if ~open('ofn',fileslist,'A') then
  341.                 do
  342.                     say 'wraptofile:Cannot open 'fileslist
  343.                     exit 10
  344.                 end
  345.             
  346.                 do while ~eof('ifn')
  347.                     line    = readln('ifn')
  348.                     if left(line,1) ~= " " then
  349.                     do
  350.                         /* add leading space */
  351.                         writech('ofn',' 'wrap_line(line,FLLEN,MARGINALL)) 
  352.                     end /* not a comment line */
  353.                     else do
  354.                             writech('ofn',line||cr)
  355.                     end /* was a comment line */
  356.                 end /*eof */
  357.                 call close('ifn')
  358.                 call close('ofn')
  359.                 if Password.area = "PASSWORD."area | Password.area = "" then 
  360.                 do
  361.                     address COMMAND 'List >>"'freqtmp'"' Path.area||exclude 'FILES NOHEAD LFORMAT='LFFREQ
  362.                 end
  363.                 else do
  364.                     SAY 'Area:'area 'Password:'Password.area
  365.                     address COMMAND 'List >>"'freqtmp'"' Path.area||exclude 'FILES NOHEAD LFORMAT="%N !'Password.area' %F%N"'
  366.                 end
  367.             end
  368.         end
  369.     end
  370. return 0
  371.  
  372. listandsort:
  373. /* list <tdir> with <lfmt> and sort to <tfile> */
  374.     tdir        =       arg(1)
  375.     tfile       =       arg(2)
  376.     lfmt    =       arg(3)
  377.     las =   'PIPE LIST 'tdir||exclude' FILES NOHEAD LFORMAT 'lfmt' | SORT In: 'tfile
  378.     address command las
  379. return 0
  380.  
  381. /* add a line to a file list                */
  382. /* appendtolist(outputfilename, 'string')   */
  383. appendtolist:
  384.     outfn=dequote(arg(1))
  385.  
  386.     if ~exists(outfn) then
  387.     do
  388.         say 'appendtolist:Cannot append to 'outfn
  389.         return 20
  390.     end
  391.     else do
  392.         open('tlst',outfn,'A')
  393.         call writech('tlst',arg(2))
  394.         close('tlst')
  395.     end
  396. return 0
  397.  
  398. /* prepend area.text to files.bbs                               */
  399. /*    addareatext(dir,files.bbs,area.text,output)               */
  400. /*    addareatext(dir,files.bbs,area.text,output,where)         */
  401. /* where= append or prepend(DEFAULT)                            */
  402. /*  example:                                                    */
  403. /*    call addareatext(Path.area,availlist,areatext,availlist)  */
  404. addareatext:
  405.     inlist      =   arg(2)
  406.     descfile    =   addslash(dequote(arg(1)))||arg(3)
  407.     tolist      =   arg(4)
  408.     where       =   arg(5)
  409.  
  410.     if ~exists(inlist) then
  411.     do
  412.         say 'addareatext: cannot find 'inlist
  413.         return 20
  414.     end
  415.     
  416.     if ~exists(descfile) then
  417.     do
  418.         say 'addareatext: cannot find 'descfile' using 'default 
  419.         if where='append' then
  420.         do
  421.             call open('ds',descfile,'a')
  422.             call writech('ds',default)
  423.         end
  424.         else do
  425.             call open('ds',descfile,'w')
  426.             call writech('ds',default)
  427.         end
  428.         call close('ds')  
  429.     end
  430.     if where = 'append' then
  431.     do
  432.         call join(inlist,descfile,tolist)
  433.     end
  434.     else do
  435.         call join(descfile,inlist,tolist)
  436.     end
  437. return 0
  438.  
  439. wrap_line:
  440.     text        =   arg(1)
  441.     right_edge  =   arg(2)  /* line length */
  442.     left_edge   =   arg(3)  /*   margin    */
  443.  
  444.     new_text = ''
  445.  
  446.     do while length(text) > 0
  447.         broken_word = 0
  448.         if length(text) < right_edge then
  449.         do
  450.             new_text = new_text || text || '0a'x
  451.             text = ''
  452.         end
  453.         else do
  454.             temp_text = strip(text,l)
  455.             diff = length(text) - length(temp_text)
  456.             first_break = lastpos(' ',temp_text,right_edge - diff)
  457.             break_point = first_break + diff
  458.             if left_edge = break_point then
  459.             do
  460.                 break_point = right_edge - 1
  461.                 broken_word = 1
  462.             end
  463.  
  464.             new_text = new_text || strip(left(text,break_point),t)
  465.             if broken_word then
  466.             do
  467.                 new_text = new_text || '-'
  468.             end
  469.             new_text = new_text || '0a'x
  470.             text = copies(' ',left_edge) || strip(right(text,length(text) - break_point),l)
  471.         end
  472.     end
  473. return new_text
  474.  
  475. /* general procedures */
  476.  
  477. /*
  478.         join -- a 'front end' for join. Fixes a problem with join.
  479.         uses a tempfile if target filename is same as one to cat
  480. */
  481. join:
  482.     x=arg(1)' 'arg(2)' 'arg(3)
  483.     temp = 'arexxtempfile'
  484.     do i=1 to (words(x)-1)
  485.         if word(x,i) = word(x,words(x)) then
  486.         do
  487.             oops = word(x,words(x))
  488.             x = delword(x,words(x))||'TO '||temp
  489.             address COMMAND 'Join' x
  490.             address COMMAND 'Copy ' temp ' ' oops
  491.             call delete(temp)
  492.             return 0
  493.         end
  494.     end
  495.     x=arg(1)' 'arg(2)' TO 'arg(3)
  496.     address COMMAND 'Join' x
  497. return 0
  498.  
  499. addslash:
  500.     curr = arg(1)
  501.     select
  502.         when right(curr, 1) = ":" then nop
  503.             when right(curr, 1) = "/" then nop
  504.                 otherwise curr = curr"/"
  505.     end
  506. return curr
  507.  
  508. /* a useful procedure by Walt Sullivan  */
  509. dequote:
  510.     parse arg thing
  511.     parse var thing '"' unq_thing '"'
  512.     if unq_thing ~= "" then return unq_thing
  513. return thing
  514.  
  515. usage:
  516.     say 'The calling convention is: rx Wfilelist ALL|AREA'
  517.     say '    freq  Creates freq list'
  518.     say '    all   Creates and archives an all files listing'
  519.     say '          and a Wnotify FREQ listing.' 
  520.     exit 0
  521. end
  522. /*
  523.   Error handling
  524. */
  525.  
  526. halt:
  527. ioerr:
  528. break_c:
  529. break_d:
  530.     call writech(stdout,cr)
  531.     exit 10
  532.  
  533.